package model;

import java.io.Serializable;
import java.util.ArrayList;

import javax.swing.JComponent;

/**
* Usuario de la aplicacion: 
* Esta clase engloba a todas los atributos y operaciones
* naturales de un usuario de la aplicacion
* 
*
* @author Programacion Avanzada - Grupo I 
* @version 17.06.2013
*/

public class Usuario  extends JComponent implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String nick;
	private String password;
	
	private String nombre;
	private String apellido;
	
	private boolean activo;
	private String estado;
	

	private int privilegios;
	
	private String preguntaSecreta;
	private String respuesta;
	
	private String fecha_alta;
	
	private ArrayList<Usuario> amigos;
	private ArrayList<Usuario> bloqueados;
	private ArrayList<Notificacion> notificaciones;
	
	private ArrayList<Log> historialLogs;
	

	/**
    * Constructor por defecto.
    * @param id id del usuario.
    * @param nick nick del usuario.
    * @param privilegios privilegios del usuario.
    * @param password password del usuario.
    * @param nombre nombre del usuario.
    * @param apellido apellido del usuario.
    * @param preguntaSecreta pregunta secreta del usuario.
    * @param preguntaSecreta respuesta a la pregunta secreta del usuario.
    */
	public Usuario()
	{
		this.id = -1;
		this.nick = "";
		this.privilegios = 0;
		this.password = "";
		this.nombre = "";
		this.preguntaSecreta = "";
		this.respuesta = "";
		
		this.amigos = new ArrayList<Usuario>();
		this.historialLogs = new ArrayList<Log>();
	}
	
	
	/**
	    * Constructor parametrizado.
	    * @param id id del usuario.
	    * @param nick nick del usuario.
	    * @param privilegios privilegios del usuario.
	    * @param password password del usuario.
	    * @param nombre nombre del usuario.
	    * @param apellido apellido del usuario.
	    * @param preguntaSecreta pregunta secreta del usuario.
	    * @param preguntaSecreta respuesta a la pregunta secreta del usuario.
	    */
	public Usuario(int id, String nick, String password, String nombre, String apellido, String preguntaSecreta, String respuesta)
	{
		this.id = id;
		this.nick = nick;
		this.password = password;
		this.nombre = nombre;
		this.apellido = apellido;
		this.preguntaSecreta = preguntaSecreta;
		this.respuesta = respuesta;
	}
	
	public boolean addAmigo (Usuario u)
	{
		this.amigos.add(u);
		return this.amigos.contains(u);
	}
	
	public boolean removeAmigo (Usuario u)
	{
		this.amigos.remove(u);
		return !(this.amigos.contains(u));
	}
	
	public boolean addLog (Log l)
	{
		this.historialLogs.add(l);
		return this.historialLogs.contains(l);
	}
	
	public ArrayList<Log> getHistorialLogs() {
		return historialLogs;
	}

	public void setHistorialLogs(ArrayList<Log> historialLogs) {
		this.historialLogs = historialLogs;
	}

	public boolean removeLog (Log l)
	{
		this.historialLogs.remove(l);
		return !(this.historialLogs.contains(l));
	}
	
	
	public boolean isActivo() {
		return activo;
	}


	public void setActivo(boolean activo) {
		this.activo = activo;
	}


	/** 
     * Metodo getter del atributo id
     * @return  int el id del usuario
     */
	public int getId() {
		return id;
	}

	/** 
     * Metodo setter del atributo id
     * @param int id del usuario
     */
	public void setId(int id) {
		this.id = id;
	}

	/** 
     * Metodo getter del atributo nick
     * @return  int el nick del usuario
     */
	public String getNick() {
		return nick;
	}

	/** 
     * Metodo setter del atributo nick
     * @param int nick del usuario
     */
	public void setNick(String nick) {
		this.nick = nick;
	}
	
	
	/** 
     * Chequea si el usuario es un administrador del sistema
     * @param boolean true o false
     */
	public boolean isAdmin()
	{
		return (this.privilegios == 1);
	}

	/** 
     * Metodo getter del atributo privilegios
     * @return  int nivel de privilegios del usuario
     * 
     *  0 privilegios de usuario comun
     *  1 privilegios de administrador
     */
	public int getPrivilegios() {
		return privilegios;
	}

	/** 
     * Metodo setter del atributo privilegios
     * @param int privilegios del usuario
     * 
     *  0 privilegios de usuario comun
     *  1 privilegios de administrador
     */
	public void setPrivilegios(int privilegios) {
		this.privilegios = privilegios;
	}

	/** 
     * Metodo getter del atributo password
     * @return  int el password del usuario
     */
	public String getPassword() {
		return password;
	}

	/** 
     * Metodo setter del atributo password
     * @param String password del usuario
     */
	public void setPassword(String password) {
		this.password = password;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((nick == null) ? 0 : nick.hashCode());
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (nick == null) {
			if (other.nick != null)
				return false;
		} else if (!nick.equals(other.nick))
			return false;
		return true;
	}


	/** 
     * Metodo getter del atributo id
     * @return  String el nombre del usuario
     */
	public String getNombre() {
		return nombre;
	}

	/** 
     * Metodo setter del atributo nombre
     * @param String nombre del usuario
     */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/** 
     * Metodo getter del atributo apellido
     * @return  String el apellido del usuario
     */
	public String getApellido() {
		return apellido;
	}

	/** 
     * Metodo setter del atributo apellido
     * @param String apellido del usuario
     */
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	/** 
     * Metodo getter de la pregunta secreta del usuario
     * @return  String la pregunta secreta
     */
	public String getPreguntaSecreta() {
		return preguntaSecreta;
	}

	/** 
     * Metodo setter del atributo preguntaSecreta
     * @param String Pregunta secreta del usuario
     */
	public void setPreguntaSecreta(String preguntaSecreta) {
		this.preguntaSecreta = preguntaSecreta;
	}

	/** 
     * Metodo getter de la respuesta a la pregunta del usuario
     * @return  String la respuesta a la pregunta secreta
     */
	public String getRespuesta() {
		return respuesta;
	}

	/** 
     * Metodo setter del atributo respuesta
     * @param String Respuesta secreta del usuario
     */
	public void setRespuesta(String respuesta) {
		this.respuesta = respuesta;
	}


	public String getFecha_alta() {
		return fecha_alta;
	}


	public void setFecha_alta(String fecha_alta) {
		this.fecha_alta = fecha_alta;
	}


	public ArrayList<Usuario> getAmigos() {
		return amigos;
	}


	public void setAmigos(ArrayList<Usuario> amigos) {
		this.amigos = amigos;
	}
	
	public boolean isAmigo (Usuario u)
	{
		return this.amigos.contains(u);
	}

	public ArrayList<Usuario> getBloqueados() {
		return bloqueados;
	}


	public void setBloqueados(ArrayList<Usuario> bloqueados) {
		this.bloqueados = bloqueados;
	}


	public ArrayList<Notificacion> getNotificaciones() {
		return notificaciones;
	}


	public void setNotificaciones(ArrayList<Notificacion> notificaciones) {
		this.notificaciones = notificaciones;
	}

	public String toString(){
		return (this.nick + " " + (this.activo?"(Conectado)":"(No Conectado)"));
	}
	
	public String getEstado() {
		return estado;
	}


	public void setEstado(String estado) {
		this.estado = estado;
	}
	
}